home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Linux Cubed Series 8: LINUX Games
/
Linux Cubed Series 8 - LINUX Games.iso
/
games
/
x11
/
rpg
/
crossfir.92
/
crossfir
/
crossfire-0.92.5
/
doc
/
skills_developer.doc
< prev
next >
Wrap
Text File
|
1996-07-24
|
15KB
|
430 lines
SKILLS/EXPERIENCE DOCUMENTATION for DEVELOPERS
----------------------------------------------
- Summary -
0. Introduction
1. Sketch of system
a. Initialization - how skills and experience are linked
2. How to adjust skill parameters/links with experience objects
a. legal values for experience category
b. legal values for associated stats
3. How to add new skills
a. creation of new skill: outline of needed steps
b. important skills archetype values
4. How to reconfigure the experience categories
5. Appendices
a. glossary of terminology
b. road map of likely routine calls in exp/skills code
c. Known Bugs/Todo list
0. Introduction
---------------
When crossfire is compiled with the ALLOW_SKILLS flag defined
the new skills/experience system is enabled. This system is coded
with flexibility in mind so that the user may reconfigure the
skills/exp code as they desire in a fairly easy way. In this
document, a discussion of issues of interest to developers is
presented.
Corrections or comments on how to improve this document are
welcome.
-b.t. (thomas@astro.psu.edu)
8/30/95
1. Sketch of system
-------------------
In the skills/experience code, players gain experience for the
activities which they perform in the game ("You are what you do").
The activities a player may engage in are controlled by the skills
they possess. All players start with a basic set of skills which
they may expand through adventuring. While monsters do not gain
experience from the use of skills, they may use any skills
which exist in their inventory if they have the can_use_skill
flag set.
In the code, both experience and skills are objects which exist
in the player/monster inventory. Both NPC/monsters and players
use the same skill archetypes. Not all skills are however enabled
for monster use. Check the Skills_players.doc for available
NPC skills.
a. Initialization - how skills and experience are linked
During initialization, the code binds skills and experience
objects according to their shared stats (see link_skills_to_exp()
in skill_util.c). The skills[] array (in skillist.h) is used by
the code to initialize the default parameters of the skills
objects. After initialization, the code realigns the bindings and
skill parameters according to any entries in the skill_params file
(see below, and read_skill_param() in skill_util.c). If no skill
is entered in the skill_params file, the default binding is used.
2. How to adjust skill parameters/links with experience objects
---------------------------------------------------------------
Alteration of the skill_params file (in the lib directory) will
change the default skills parameters (without recompiling the
game). Each entry has the following format (for example):
<skill name>
int int int float int int int
An example entry:
set traps
2 5 3 2.0 5 1 99
Skill name is *not* changeable by the skill_params file, in fact
it appears in the file only to identify the skill for which
the skill_params file will alter the parameters. In order, the
parameters which are changeable are the numerical values below
the skill name:
-associated experience category, see below for value (int)
-time to use the skill, in ticks (int)
-base experience to award for successful use (int)
-level experience modifier (see calc_skill_exp()) (float)
-primary stat of skill, see below (int)
-secondary stat of skill, see below (int)
-tertiary stat of skill, see below (int)
a. legal values for experience category
Numerical values of the experience categories is shown by using
the 'crossfire -m5' command. Release code has "7" experience
objects. A dump of the release code shows:
exper_catgry str dex con wis cha int pow
0-agility 0 1 0 0 0 0 0
1-personality 0 0 0 0 1 0 0
2-mental 0 0 0 0 0 1 0
3-physique 1 0 1 0 0 0 0
4-magic 0 0 0 0 0 0 1
5-wisdom 0 0 0 1 0 0 0
For example, the value for the "agility" experience object is
'0'. The seventh experience category (not listed) is the "none"
category. It always has the value of the last listed experience
category plus one (in the above case, the "none" experience
category is value '6'). In the skill_params file, setting the
experience category to the value for the "none" experience object
will make that skill a miscellaneous skill.
b. legal values for associated stats
The associated stats of a skill may be altered by inputing the
value of the new stat (as given in living.h) :
#define STR 0
#define DEX 1
#define CON 2
#define WIS 3
#define CHA 4
#define INT 5
#define POW 6
#define NO_STAT 99
In the above example (set traps), the associated skills are set
to:
-primary stat => Intelligence
-secondary stat => Dexterity
-tertiary stat => no stat
3. How to add new skills
-------------------------
Adding a new skill to CF is not overly difficult, it is little
more difficult than adding new archetypes and a spell to the game.
a. creation of new skill: outline of needed steps
A number of steps are required to create a new skill. Below I
outline the steps need to add a learned skill to the game. Note
that in order to add a new skill you will need to acquire the
appropriate CF archetype tarfile (crossfire-0.??.?.arch.tar.gz).
1) Edit a new skills archetype. See below for appropriate para-
meters. If you desire the skill to be a skill tool, edit a
"face" for the new skill. If you want to have the skill to be
learned via a skill scroll, edit a skillscroll for the skill.
Place the new archetype(s) in the lib/arch/skills directory.
Remember to name your new skill appropriately (ie skill_<new
skill name>).
2) Edit include files. Add a table entry for the skill in
skillist.h. Add an index entry for the skill to skills.h. Bump
up the value of NROFSKILLS in define.h by one.
3) Edit skill_util.c. Add an entry for the skill in do_skill() (so
that it may be used as a "long-range attack"). If the new skill
is a hth attack take a look at the attack_hth_skills[] table in
do_skill_attack() -- where does the hth attack rank? The most
useful attacks should occur earlier in the table.
4) Create the skill code. If you created a hth attack, you probably
can get away with just using attack_hth. For other skills, put
the skill code in skills.c. If your new skill is to be an
"associated" skill, then make sure that it returns the value of
calc_skill_exp().
5) Edit treasures/artifacts file as needed (esp. if your skill will
become one of the starting skills, or will show up in shops.)
b. important skills archetype values
Several parameters must be present/set correctly in the skill
archetypes or the new skill will not function properly.
All skills must have:
- "type" set to the value of SKILL in define.h
- value of "sp" must equal table entry in skills.h
Learned skills must have:
- "invisible" and "no_drop" set to "1"
Skill tools must have:
- "face" set to archetype that displays the face.
- "weight" and "value" set to reasonable values.
Skill scrolls must have:
- "type" set to value of SKILLSCROLL in define.h
- "identified", "material", "nrof" set to "1"
- "weight" and "value" set to reasonable values.
- "slaying" value set to the *archetype* name of the skill that
will be learned from reading the scroll.
Skills that will do damage (ie hth attacks) require:
- value of "dam" and "last_sp" set reasonably.
There are in addition a number of other parameters that may be set
in skills (and have effect in the game). Take a look at
fix_player() in common/living.c and skill archs for more info.
4. How to reconfigure the experience categories
-----------------------------------------------
The experience system is fairly flexible in the number of allowed
kinds of experience. As each type of experience requires at least
1 unique stat, the maximum number of experience objects is 8 (incl.
the "none" category). Because the code in fix_player() currently
requires that the "cleric experience object" (used for advancing
grace) and the "wizard experience object" (use of advancing the
amount of mana) are required to be different, the minimum number of
experience objects is 3 (incl. the "none" experience object).
Release skill/exp code has 7 experience objects enabled: physique
(STR,CON), mental (INT), magic (POW), agility (DEX), wisdom (WIS),
personality (CHA), and none (NULL).
To reconfigure the experience system, all that is needed is to edit
the stat values of the experience archetypes in lib/arch/skills.
There are a couple of things that should be watched out for when
reconfiguring:
1- you will need to set once each of the stats in the
experience objects. (ex Cha 1 must occur in one of the exp
archetypes).
2- No 2 experience archs may both have the same stat set.
(ex. "Str 1" set in two or more exp. archs is bad news)
3- "Pow 1" and "Wis 1" must occur in different experience
archetypes. (Remember the requirement that wiz and cleric
experience objects have to be different).
Compile the new archs, and install the new fonts. Take a look at your
new alignment by using the 'crossfire -m5' command. Make sure all
associated skills have an experience category.(!)
5. Appendices
-------------
a. glossary of terminology
associated skill -- This is the term for a skill which can
generate experience when used.
Associated skills are linked (or
'associated') with one kind of
experience category.
associated stat -- this is one of the stats associated with
a particular skill (see skills[] array).
The code uses these during initialization
to determine the default bindings of
skills to experience categories, and
during play to know which player stats
will alter the experience gained by using
a particular skill.
experience category This is one type of experience that it is
possible for players to accumulate in the
game.
experience object -- This is an invisible object. Each
experience object represents a different
"experience category". Experience of a
player in a particular experience
category is recorded in a unique
experience object which the player has
in their inventory.
learned skill -- This is a skill which is represented by
an invisible skill object in the player
inventory.
miscellaneous skill This skill does not generate experience
when it is used. Skill objects which
represent miscellaneous skills are un-
linked (not 'associated') to any
experience category.
skill object -- This may be either an invisible or
visible object carried in the player or
monster inventory. If the skill object is
visible is is called a "tool" or "skill
tool". If the skill object is invisible
it is called a "learned skill". Players
may pickup/drop skill tools. Each skill
object represents a unique skill. Each
skill object in the player inventory
which represents an "associated skill"
is linked to a unique experience object
in the player inventory. Skill objects
which represent "miscellaneous" skills
remain unlinked to any experience
object.
skill tool -- This is a skill which is represented by
a visible object in the player
inventory. This object may be picked up
or dropped by the player.
b. road map of likely routine calls in exp/skills code
In "road maps", horizontal branches are called first, then vertical.
Note that not all routines may always be called (nor are all
functions shown).
Player using a readied skill
----------------------------
fire() -> check_skill_to_fire() -> change_skill() -> chan_abil()
|
v
do_skill() -> "skill fctn" -> calc_skill_exp() -> stat_mod_exp()
|
v
add_exp()
Player changing skill via "use_skill" command
---------------------------------------------
change_skill() -> chan_abil()
Player using a magic item (rod, wand, horn)
-------------------------------------------
fire() -> check_skill_to_fire() -> change_skill()
|
v
cast_spell()
Player running into a creature (and makes attack)
-------------------------------------------------
move_player_attack()
|
v
skill_attack() -> do_skill_attack() -> hth_damage()
|
v
attack_ob() -> add_exp()
Player applies a skill tool
---------------------------
apply() -> change_skill() -> chan_abil()
Player readies an item that requires a skill to use (melee weapon,
missile weapon, wand, rod, horn)
-----------------------------------------------------------------
apply() or apply_special() -> check_skill_to_apply()
|
v
change_skill() -> chan_abil()
c. Known Bugs/Todo list (some of which concerned w/ 2 magic
system)
A minor unusual bugs I know about:
- kills made by summoned pet monsters send experience to the
player's correct experience object (and modified correctly
because set_owner() is now working right). BUT-If a summoned monster
should ever pickup a skill tool, and apply it, then exp from
that monster will no longer go to the player. I suppose I could
fix this by preventing all "owned" creatures from using skill
tools.
- if a skill name is misspelled in skill_params file the program
will fail to load (heh, crash that is :). This should have been
taken care of in lookup_skill_by_name() but it apparently isnt.
Several things might make the exp/skills code better.
== add a spell patch for the cause wounds spells (right now its
PATH_NULL).
== creation of a "throwing skill" - allow players and NPC's to use
== creation of a "set traps skill" - this would allow players to
"create" traps anywhere as long as they have the skill and traps
components (new archs) which should be able to acquire from
disarming traps and find in "specialty" shops for sale.
== more priest spells (that kill stuff, gain priest exp).
== creation of a invisible "skills container" for player skills.
currently the code just whips through the entire non-container
inventory of the player to search for skills (cf change_skill()
routine in skill_util.c). This seems to be kinda inefficient when
a player is carrying around massive amounts of crap.
== Add exotic weapons attacks in attack_melee_weapon(). For example,
a 'disarming' attack for player using Sai.